home *** CD-ROM | disk | FTP | other *** search
/ Amiga Magazin: Amiga-CD 1997 September & October / Amiga-CD 1997 #9-10.iso / aminet / gameboyemulator / codes.h < prev    next >
Text File  |  1995-10-29  |  12KB  |  354 lines

  1. /** VGB: portable GameBoy emulator ***************************/
  2. /**                                                         **/
  3. /**                          Codes.h                        **/
  4. /**                                                         **/
  5. /** This file contains implementation for the main table of **/
  6. /** Z80 commands. It is included from Z80.c.                **/
  7. /**                                                         **/
  8. /** Copyright (C) Marat Fayzullin 1994,1995                 **/
  9. /**     You are not allowed to distribute this software     **/
  10. /**     commercially. Please, notify me, if you make any    **/
  11. /**     changes to this file.                               **/
  12. /*************************************************************/
  13.  
  14. case 0x08:
  15.   J.B.l=*(Addr+(R.PC.W++));
  16.   J.B.h=*(Addr+(R.PC.W++));
  17.   M_WRMEM(J.W,R.SP.B.l);J.W++;
  18.   M_WRMEM(J.W,R.SP.B.h);break;
  19.  
  20. case 0x22:     M_WRMEM(R.HL.W++,R.AF.B.h);break;
  21. case 0x2A:     R.AF.B.h=*(Addr+(R.HL.W++));break;
  22.  
  23. case 0x32:     M_WRMEM(R.HL.W--,R.AF.B.h);break;
  24. case 0x3A:     R.AF.B.h=*(Addr+(R.HL.W--));break;
  25.  
  26. case 0xD9:     R.IFF|=0x01;M_RET;break;
  27.  
  28. case 0xE0:     M_WRMEM(0xFF00+*(Addr+(R.PC.W++)),R.AF.B.h);break;
  29. case 0xE2:     M_WRMEM(0xFF00+R.BC.B.l,R.AF.B.h);break;
  30. case 0xE8:     R.SP.W+=*(offset *)(Addr+(R.PC.W++));break;
  31. case 0xEA:
  32.   J.B.l=*(Addr+(R.PC.W++));
  33.   J.B.h=*(Addr+(R.PC.W++));
  34.   M_WRMEM(J.W,R.AF.B.h);
  35.   break;
  36.  
  37. case 0xF0:     R.AF.B.h=*(Addr+0xFF00+*(Addr+(R.PC.W++)));break;
  38. case 0xF2:     R.AF.B.h=*(Addr+0xFF00+R.BC.B.l);break;
  39. case 0xF8:     R.HL.W=R.SP.W+*(offset *)(Addr+(R.PC.W++));break;
  40. case 0xFA:
  41.   J.B.l=*(Addr+(R.PC.W++));
  42.   J.B.h=*(Addr+(R.PC.W++));
  43.   R.AF.B.h=*(Addr+J.W);
  44.   break;
  45.  
  46. case JR_NZ:    if(R.AF.B.l&Z_FLAG)  R.PC.W++; else { M_JR; } break;
  47. case JR_NC:    if(R.AF.B.l&C_FLAG)  R.PC.W++; else { M_JR; } break;
  48. case JR_Z:     if(R.AF.B.l&Z_FLAG)  { M_JR; } else R.PC.W++; break;
  49. case JR_C:     if(R.AF.B.l&C_FLAG)  { M_JR; } else R.PC.W++; break;
  50.  
  51. case JP_NZ:    if(R.AF.B.l&Z_FLAG)  R.PC.W+=2; else { M_JP; }  break;
  52. case JP_NC:    if(R.AF.B.l&C_FLAG)  R.PC.W+=2; else { M_JP; }  break;
  53. case JP_Z:     if(R.AF.B.l&Z_FLAG)  { M_JP; }  else R.PC.W+=2; break;
  54. case JP_C:     if(R.AF.B.l&C_FLAG)  { M_JP; }  else R.PC.W+=2; break;
  55.  
  56. case RET_NZ:   if(!(R.AF.B.l&Z_FLAG))  { M_RET; }  break;
  57. case RET_NC:   if(!(R.AF.B.l&C_FLAG))  { M_RET; }  break;
  58. case RET_Z:    if(R.AF.B.l&Z_FLAG)     { M_RET; }  break;
  59. case RET_C:    if(R.AF.B.l&C_FLAG)     { M_RET; }  break;
  60.  
  61. case CALL_NZ:  if(R.AF.B.l&Z_FLAG)  R.PC.W+=2;  else { M_CALL; } break;
  62. case CALL_NC:  if(R.AF.B.l&C_FLAG)  R.PC.W+=2;  else { M_CALL; } break;
  63. case CALL_Z:   if(R.AF.B.l&Z_FLAG)  { M_CALL; } else R.PC.W+=2;  break;
  64. case CALL_C:   if(R.AF.B.l&C_FLAG)  { M_CALL; } else R.PC.W+=2;  break;
  65.  
  66. case ADD_B:    M_ADD(R.BC.B.h);break;
  67. case ADD_C:    M_ADD(R.BC.B.l);break;
  68. case ADD_D:    M_ADD(R.DE.B.h);break;
  69. case ADD_E:    M_ADD(R.DE.B.l);break;
  70. case ADD_H:    M_ADD(R.HL.B.h);break;
  71. case ADD_L:    M_ADD(R.HL.B.l);break;
  72. case ADD_A:    M_ADD(R.AF.B.h);break;
  73. case ADD_xHL:  I=*(Addr+R.HL.W);M_ADD(I);break;
  74. case ADD_BYTE: I=*(Addr+(R.PC.W++));M_ADD(I);break;
  75.  
  76. case SUB_B:    M_SUB(R.BC.B.h);break;
  77. case SUB_C:    M_SUB(R.BC.B.l);break;
  78. case SUB_D:    M_SUB(R.DE.B.h);break;
  79. case SUB_E:    M_SUB(R.DE.B.l);break;
  80. case SUB_H:    M_SUB(R.HL.B.h);break;
  81. case SUB_L:    M_SUB(R.HL.B.l);break;
  82. case SUB_A:    R.AF.B.h=0;R.AF.B.l=N_FLAG|Z_FLAG;break;
  83. case SUB_xHL:  I=*(Addr+R.HL.W);M_SUB(I);break;
  84. case SUB_BYTE: I=*(Addr+(R.PC.W++));M_SUB(I);break;
  85.  
  86. case AND_B:    M_AND(R.BC.B.h);break;
  87. case AND_C:    M_AND(R.BC.B.l);break;
  88. case AND_D:    M_AND(R.DE.B.h);break;
  89. case AND_E:    M_AND(R.DE.B.l);break;
  90. case AND_H:    M_AND(R.HL.B.h);break;
  91. case AND_L:    M_AND(R.HL.B.l);break;
  92. case AND_A:    M_AND(R.AF.B.h);break;
  93. case AND_xHL:  I=*(Addr+R.HL.W);M_AND(I);break;
  94. case AND_BYTE: I=*(Addr+(R.PC.W++));M_AND(I);break;
  95.  
  96. case OR_B:     M_OR(R.BC.B.h);break;
  97. case OR_C:     M_OR(R.BC.B.l);break;
  98. case OR_D:     M_OR(R.DE.B.h);break;
  99. case OR_E:     M_OR(R.DE.B.l);break;
  100. case OR_H:     M_OR(R.HL.B.h);break;
  101. case OR_L:     M_OR(R.HL.B.l);break;
  102. case OR_A:     M_OR(R.AF.B.h);break;
  103. case OR_xHL:   I=*(Addr+R.HL.W);M_OR(I);break;
  104. case OR_BYTE:  I=*(Addr+(R.PC.W++));M_OR(I);break;
  105.  
  106. case ADC_B:    M_ADC(R.BC.B.h);break;
  107. case ADC_C:    M_ADC(R.BC.B.l);break;
  108. case ADC_D:    M_ADC(R.DE.B.h);break;
  109. case ADC_E:    M_ADC(R.DE.B.l);break;
  110. case ADC_H:    M_ADC(R.HL.B.h);break;
  111. case ADC_L:    M_ADC(R.HL.B.l);break;
  112. case ADC_A:    M_ADC(R.AF.B.h);break;
  113. case ADC_xHL:  I=*(Addr+R.HL.W);M_ADC(I);break;
  114. case ADC_BYTE: I=*(Addr+(R.PC.W++));M_ADC(I);break;
  115.  
  116. case SBC_B:    M_SBC(R.BC.B.h);break;
  117. case SBC_C:    M_SBC(R.BC.B.l);break;
  118. case SBC_D:    M_SBC(R.DE.B.h);break;
  119. case SBC_E:    M_SBC(R.DE.B.l);break;
  120. case SBC_H:    M_SBC(R.HL.B.h);break;
  121. case SBC_L:    M_SBC(R.HL.B.l);break;
  122. case SBC_A:    M_SBC(R.AF.B.h);break;
  123. case SBC_xHL:  I=*(Addr+R.HL.W);M_SBC(I);break;
  124. case SBC_BYTE: I=*(Addr+(R.PC.W++));M_SBC(I);break;
  125.  
  126. case XOR_B:    M_XOR(R.BC.B.h);break;
  127. case XOR_C:    M_XOR(R.BC.B.l);break;
  128. case XOR_D:    M_XOR(R.DE.B.h);break;
  129. case XOR_E:    M_XOR(R.DE.B.l);break;
  130. case XOR_H:    M_XOR(R.HL.B.h);break;
  131. case XOR_L:    M_XOR(R.HL.B.l);break;
  132. case XOR_A:    R.AF.B.h=0;R.AF.B.l=Z_FLAG;break;
  133. case XOR_xHL:  I=*(Addr+R.HL.W);M_XOR(I);break;
  134. case XOR_BYTE: I=*(Addr+(R.PC.W++));M_XOR(I);break;
  135.  
  136. case CP_B:     M_CP(R.BC.B.h);break;
  137. case CP_C:     M_CP(R.BC.B.l);break;
  138. case CP_D:     M_CP(R.DE.B.h);break;
  139. case CP_E:     M_CP(R.DE.B.l);break;
  140. case CP_H:     M_CP(R.HL.B.h);break;
  141. case CP_L:     M_CP(R.HL.B.l);break;
  142. case CP_A:     R.AF.B.l=N_FLAG|Z_FLAG;break;
  143. case CP_xHL:   I=*(Addr+R.HL.W);M_CP(I);break;
  144. case CP_BYTE:  I=*(Addr+(R.PC.W++));M_CP(I);break;
  145.                
  146. case LD_BC_WORD: M_LDWORD(BC);break;
  147. case LD_DE_WORD: M_LDWORD(DE);break;
  148. case LD_HL_WORD: M_LDWORD(HL);break;
  149. case LD_SP_WORD: M_LDWORD(SP);break;
  150.  
  151. case LD_PC_HL: R.PC.W=R.HL.W;break;
  152. case LD_SP_HL: R.SP.W=R.HL.W;break;
  153. case LD_A_xBC: R.AF.B.h=*(Addr+R.BC.W);break;
  154. case LD_A_xDE: R.AF.B.h=*(Addr+R.DE.W);break;
  155.  
  156. case ADD_HL_BC:  M_ADDW(HL,BC);break;
  157. case ADD_HL_DE:  M_ADDW(HL,DE);break;
  158. case ADD_HL_HL:  M_ADDW(HL,HL);break;
  159. case ADD_HL_SP:  M_ADDW(HL,SP);break;
  160.  
  161. case DEC_BC:   R.BC.W--;break;
  162. case DEC_DE:   R.DE.W--;break;
  163. case DEC_HL:   R.HL.W--;break;
  164. case DEC_SP:   R.SP.W--;break;
  165.  
  166. case INC_BC:   R.BC.W++;break;
  167. case INC_DE:   R.DE.W++;break;
  168. case INC_HL:   R.HL.W++;break;
  169. case INC_SP:   R.SP.W++;break;
  170.  
  171. case DEC_B:    M_DEC(R.BC.B.h);break;
  172. case DEC_C:    M_DEC(R.BC.B.l);break;
  173. case DEC_D:    M_DEC(R.DE.B.h);break;
  174. case DEC_E:    M_DEC(R.DE.B.l);break;
  175. case DEC_H:    M_DEC(R.HL.B.h);break;
  176. case DEC_L:    M_DEC(R.HL.B.l);break;
  177. case DEC_A:    M_DEC(R.AF.B.h);break;
  178. case DEC_xHL:  I=*(Addr+R.HL.W);M_DEC(I);M_WRMEM(R.HL.W,I);break;
  179.  
  180. case INC_B:    M_INC(R.BC.B.h);break;
  181. case INC_C:    M_INC(R.BC.B.l);break;
  182. case INC_D:    M_INC(R.DE.B.h);break;
  183. case INC_E:    M_INC(R.DE.B.l);break;
  184. case INC_H:    M_INC(R.HL.B.h);break;
  185. case INC_L:    M_INC(R.HL.B.l);break;
  186. case INC_A:    M_INC(R.AF.B.h);break;
  187. case INC_xHL:  I=*(Addr+R.HL.W);M_INC(I);M_WRMEM(R.HL.W,I);break;
  188.  
  189. case RLCA:
  190.   I=R.AF.B.h&0x80? C_FLAG:0;
  191.   R.AF.B.h=(R.AF.B.h<<1)|I;
  192.   R.AF.B.l=(R.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I;
  193.   break;
  194. case RLA:
  195.   I=R.AF.B.h&0x80? C_FLAG:0;
  196.   R.AF.B.h=(R.AF.B.h<<1)|(R.AF.B.l&C_FLAG);
  197.   R.AF.B.l=(R.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I;
  198.   break;
  199. case RRCA:
  200.   I=R.AF.B.h&0x01;
  201.   R.AF.B.h=(R.AF.B.h>>1)|(I? 0x80:0);
  202.   R.AF.B.l=(R.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I; 
  203.   break;
  204. case RRA:
  205.   I=R.AF.B.h&0x01;
  206.   R.AF.B.h=(R.AF.B.h>>1)|(R.AF.B.l&C_FLAG? 0x80:0);
  207.   R.AF.B.l=(R.AF.B.l&~(C_FLAG|N_FLAG|H_FLAG))|I;
  208.   break;
  209.  
  210. case RST00:    M_RST(0x0000);break;
  211. case RST08:    M_RST(0x0008);break;
  212. case RST10:    M_RST(0x0010);break;
  213. case RST18:    M_RST(0x0018);break;
  214. case RST20:    M_RST(0x0020);break;
  215. case RST28:    M_RST(0x0028);break;
  216. case RST30:    M_RST(0x0030);break;
  217. case RST38:    M_RST(0x0038);break;
  218.  
  219. case PUSH_BC:  M_PUSH(BC);break;
  220. case PUSH_DE:  M_PUSH(DE);break;
  221. case PUSH_HL:  M_PUSH(HL);break;
  222. case PUSH_AF:  M_PUSH(AF);break;
  223.  
  224. case POP_BC:   M_POP(BC);break;
  225. case POP_DE:   M_POP(DE);break;
  226. case POP_HL:   M_POP(HL);break;
  227. case POP_AF:   M_POP(AF);break;
  228.  
  229. case JP:   M_JP;break;
  230. case JR:   M_JR;break;
  231. case CALL: M_CALL;break;
  232. case RET:  M_RET;break;
  233. case SCF:  S(C_FLAG);R(N_FLAG|H_FLAG);break;
  234. case CPL:  R.AF.B.h=~R.AF.B.h;S(N_FLAG|H_FLAG);break;
  235. case CCF:  R.AF.B.l^=C_FLAG;R(N_FLAG);break;
  236. case NOP:  break;
  237. case EI:   R.IFF|=0x01;break;
  238. case DI:   R.IFF&=0xFE;break;
  239.  
  240. case LD_B_B:   R.BC.B.h=R.BC.B.h;break;
  241. case LD_C_B:   R.BC.B.l=R.BC.B.h;break;
  242. case LD_D_B:   R.DE.B.h=R.BC.B.h;break;
  243. case LD_E_B:   R.DE.B.l=R.BC.B.h;break;
  244. case LD_H_B:   R.HL.B.h=R.BC.B.h;break;
  245. case LD_L_B:   R.HL.B.l=R.BC.B.h;break;
  246. case LD_A_B:   R.AF.B.h=R.BC.B.h;break;
  247. case LD_xHL_B: M_WRMEM(R.HL.W,R.BC.B.h);break;
  248.  
  249. case LD_B_C:   R.BC.B.h=R.BC.B.l;break;
  250. case LD_C_C:   R.BC.B.l=R.BC.B.l;break;
  251. case LD_D_C:   R.DE.B.h=R.BC.B.l;break;
  252. case LD_E_C:   R.DE.B.l=R.BC.B.l;break;
  253. case LD_H_C:   R.HL.B.h=R.BC.B.l;break;
  254. case LD_L_C:   R.HL.B.l=R.BC.B.l;break;
  255. case LD_A_C:   R.AF.B.h=R.BC.B.l;break;
  256. case LD_xHL_C: M_WRMEM(R.HL.W,R.BC.B.l);break;
  257.  
  258. case LD_B_D:   R.BC.B.h=R.DE.B.h;break;
  259. case LD_C_D:   R.BC.B.l=R.DE.B.h;break;
  260. case LD_D_D:   R.DE.B.h=R.DE.B.h;break;
  261. case LD_E_D:   R.DE.B.l=R.DE.B.h;break;
  262. case LD_H_D:   R.HL.B.h=R.DE.B.h;break;
  263. case LD_L_D:   R.HL.B.l=R.DE.B.h;break;
  264. case LD_A_D:   R.AF.B.h=R.DE.B.h;break;
  265. case LD_xHL_D: M_WRMEM(R.HL.W,R.DE.B.h);break;
  266.  
  267. case LD_B_E:   R.BC.B.h=R.DE.B.l;break;
  268. case LD_C_E:   R.BC.B.l=R.DE.B.l;break;
  269. case LD_D_E:   R.DE.B.h=R.DE.B.l;break;
  270. case LD_E_E:   R.DE.B.l=R.DE.B.l;break;
  271. case LD_H_E:   R.HL.B.h=R.DE.B.l;break;
  272. case LD_L_E:   R.HL.B.l=R.DE.B.l;break;
  273. case LD_A_E:   R.AF.B.h=R.DE.B.l;break;
  274. case LD_xHL_E: M_WRMEM(R.HL.W,R.DE.B.l);break;
  275.  
  276. case LD_B_H:   R.BC.B.h=R.HL.B.h;break;
  277. case LD_C_H:   R.BC.B.l=R.HL.B.h;break;
  278. case LD_D_H:   R.DE.B.h=R.HL.B.h;break;
  279. case LD_E_H:   R.DE.B.l=R.HL.B.h;break;
  280. case LD_H_H:   R.HL.B.h=R.HL.B.h;break;
  281. case LD_L_H:   R.HL.B.l=R.HL.B.h;break;
  282. case LD_A_H:   R.AF.B.h=R.HL.B.h;break;
  283. case LD_xHL_H: M_WRMEM(R.HL.W,R.HL.B.h);break;
  284.  
  285. case LD_B_L:   R.BC.B.h=R.HL.B.l;break;
  286. case LD_C_L:   R.BC.B.l=R.HL.B.l;break;
  287. case LD_D_L:   R.DE.B.h=R.HL.B.l;break;
  288. case LD_E_L:   R.DE.B.l=R.HL.B.l;break;
  289. case LD_H_L:   R.HL.B.h=R.HL.B.l;break;
  290. case LD_L_L:   R.HL.B.l=R.HL.B.l;break;
  291. case LD_A_L:   R.AF.B.h=R.HL.B.l;break;
  292. case LD_xHL_L: M_WRMEM(R.HL.W,R.HL.B.l);break;
  293.  
  294. case LD_B_A:   R.BC.B.h=R.AF.B.h;break;
  295. case LD_C_A:   R.BC.B.l=R.AF.B.h;break;
  296. case LD_D_A:   R.DE.B.h=R.AF.B.h;break;
  297. case LD_E_A:   R.DE.B.l=R.AF.B.h;break;
  298. case LD_H_A:   R.HL.B.h=R.AF.B.h;break;
  299. case LD_L_A:   R.HL.B.l=R.AF.B.h;break;
  300. case LD_A_A:   R.AF.B.h=R.AF.B.h;break;
  301. case LD_xHL_A: M_WRMEM(R.HL.W,R.AF.B.h);break;
  302.  
  303. case LD_xBC_A: M_WRMEM(R.BC.W,R.AF.B.h);break;
  304. case LD_xDE_A: M_WRMEM(R.DE.W,R.AF.B.h);break;
  305.  
  306. case LD_B_xHL:    R.BC.B.h=*(Addr+R.HL.W);break;
  307. case LD_C_xHL:    R.BC.B.l=*(Addr+R.HL.W);break;
  308. case LD_D_xHL:    R.DE.B.h=*(Addr+R.HL.W);break;
  309. case LD_E_xHL:    R.DE.B.l=*(Addr+R.HL.W);break;
  310. case LD_H_xHL:    R.HL.B.h=*(Addr+R.HL.W);break;
  311. case LD_L_xHL:    R.HL.B.l=*(Addr+R.HL.W);break;
  312. case LD_A_xHL:    R.AF.B.h=*(Addr+R.HL.W);break;
  313.  
  314. case LD_B_BYTE:   R.BC.B.h=*(Addr+(R.PC.W++));break;
  315. case LD_C_BYTE:   R.BC.B.l=*(Addr+(R.PC.W++));break;
  316. case LD_D_BYTE:   R.DE.B.h=*(Addr+(R.PC.W++));break;
  317. case LD_E_BYTE:   R.DE.B.l=*(Addr+(R.PC.W++));break;
  318. case LD_H_BYTE:   R.HL.B.h=*(Addr+(R.PC.W++));break;
  319. case LD_L_BYTE:   R.HL.B.l=*(Addr+(R.PC.W++));break;
  320. case LD_A_BYTE:   R.AF.B.h=*(Addr+(R.PC.W++));break;
  321. case LD_xHL_BYTE: I=*(Addr+(R.PC.W++));M_WRMEM(R.HL.W,I);break;
  322.  
  323. case EX_HL_xSP:
  324.   J.B.l=*(Addr+R.SP.W);M_WRMEM(R.SP.W,R.HL.B.l);R.SP.W++;
  325.   J.B.h=*(Addr+R.SP.W);M_WRMEM(R.SP.W,R.HL.B.h);R.SP.W--;
  326.   R.HL.W=J.W;
  327.   break;
  328.  
  329. case DAA:
  330.   J.B.h=R.AF.B.h&0x0F;
  331.   J.W=(R.AF.B.l&N_FLAG)?
  332.   (
  333.     (R.AF.B.l&C_FLAG)?
  334.       (((R.AF.B.l&H_FLAG)? 0x9A00:0xA000)+C_FLAG):
  335.       ((R.AF.B.l&H_FLAG)? 0xFA00:0x0000)
  336.   )
  337.   :
  338.   (
  339.     (R.AF.B.l&C_FLAG)?
  340.       (((R.AF.B.l&H_FLAG)? 0x6600:((J.B.h<0x0A)? 0x6000:0x6600))+C_FLAG):
  341.       (
  342.         (R.AF.B.l&H_FLAG)?
  343.           ((R.AF.B.h<0xA0)? 0x0600:(0x6600+C_FLAG)):
  344.           (
  345.             (J.B.h<0x0A)? 
  346.               ((R.AF.B.h<0xA0)? 0x0000:(0x6000+C_FLAG)): 
  347.           ((R.AF.B.h<0x90)? 0x0600:(0x6600+C_FLAG))
  348.           )
  349.       )
  350.   );
  351.   R.AF.B.h+=J.B.h;
  352.   FLAGS(R.AF.B.h,J.B.l|(R.AF.B.l&N_FLAG));
  353.   break;
  354.